package com.web.controller;

import com.jfinal.core.Controller;
import com.jfinal.upload.UploadFile;
import com.mchange.v2.codegen.bean.Property;
import com.web.model.PageEdit;
import com.web.model.PageTitleImage;
import com.web.util.CompressPic;
import com.web.util.*;
import com.web.util.Properties;
import com.web.util.aliyun.ReplaceImgURL;
import org.apache.log4j.Logger;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * Created by reeves on 2015/10/7.
 */
public class RecomController extends Controller {
    private static final Logger LOGGER = Logger.getLogger(RecomController.class);


    /**
     * 从推荐集中营里面放逐出去，即取消信息的推荐资格
     * 调用接口：调用接口：http://ipaderess/editorJfinalProject/recom/removeRecomTag/{id}
     */
    public void removeRecomTag() {
        String s = getPara("pageId");
        int pageId = Integer.parseInt(s);

        boolean removeRecomTagResult = PageEdit.pageEditDao.removeRecomTag(pageId);

        if (removeRecomTagResult) {

        } else {
            LOGGER.error("在推荐集中营中取消文章推荐资格出错,文章id: " + pageId);
        }

        setAttr("result", "ok");
        renderJson();
    }

    /**
     * 弹出选择图片的页面
     */
    //TODO：浩然新的功能
    public void selectImage() {
        //String src = getPara("src");
        String pageId = getPara("pageId");
        String imageId = getPara("imageId");


        PageTitleImage pageTitleImage = PageTitleImage.pageTitleImageDao.findById(imageId);
        //String localPicPath = PageTitleImage.pageTitleImageDao.getLocalPathById(image_id);

        /**
         * 要发送给页面的信息有：
         * 1. 原图url：imageSource --->显示
         * 2. 标题图片的ID：imageId --->下一步，裁剪图片要知道图片的ID才能进行裁剪
         */
//        setAttr("imageSource", Properties.Server_IP + pageTitleImage.get("imageSource"));‘

        //OSS存储后imageSource改变，为绝对路径
        setAttr("imageSource", pageTitleImage.get("imageSource"));
        //TODO: 需要更改的地方,这里是为了在Widnows环境中调试
        //setAttr("imageSource", "http://localhost:8080/editorJfinalProject" + pageTitleImage.get("imageSource"));

        //setAttr("localPicPath",localPicPath);
        setAttr("pageId", pageId);
        setAttr("imageId", imageId);
        renderJsp("/selectImage.jsp");
    }

    /**
     * 上传标题图片
     * 接口调用地址：http://ipaderess/editorJfinalProject/edit/uploadTitleImage
     */
    //TODO: 浩然新功能
    public void uploadNewTitleImage() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        Date today = new Date();

        //TODO:云服务器&本地Linxu服务器图片储存位置
        String saveDir = Properties.ImgSaveDir_Linux + sdf.format(new Date());
        //TODO:本地Windows服务器图片存储位置
        //String saveDir = Properties.ImgSaveDir_Windows + sdf.format(today);

        /*获取上传图片文件，存储到本地*/
        UploadFile titleImage = getFile("titleImage", saveDir);

        String pageId = getPara("pageId");
        String imageId = getPara("imageId");
        int type = getParaToInt("type");
        int recomPos = getParaToInt("recomPos");
        LOGGER.info("上传新图片信息： " + titleImage.getSaveDirectory() + titleImage.getFileName());
        if (titleImage == null) {
            LOGGER.error("上传图片未获取到...");
        }

        /**
         * 压缩图片
         */
        String picPostFix = titleImage.getFile().getName().substring(titleImage.getFile().getName().lastIndexOf("."));
        String inputDir = saveDir;
        String outputDir = saveDir;
        String inputFileName = titleImage.getFileName();

        /*************************************/
        //unix时间的字符串形式：1. imageId; 2. 文件名前缀;
        String dateUnixStr = String.valueOf(new Date().getTime());
        // 日期的格式化字符串表示
        String dateStr = sdf.format(today);
        /*************************************/

        String outputFileName = dateUnixStr + picPostFix;

        /**
         * inputDir: 源文件路径
         * inputFileName: 源文件名
         * outputDir: 目的文件路径
         * outputFileName: 目的文件名
         * 第一个800: 宽度
         * 第二个800: 高度
         * true: 是否等比例缩放
         * 压缩后图像的最长边在770左右
         */
        CompressPic.compressPic.compressPic(inputDir, outputDir, inputFileName, outputFileName, 800, 800, true);

        //将标题图片上传到OSS
        String titleImgUrl = new String();
        try {
            titleImgUrl = ReplaceImgURL.replaceTitleUrl(outputDir + outputFileName);
        } catch (IOException e) {
            LOGGER.error("将标题图片上传到OSS出错",e);
        }
        /**
         * 更改数据库中原图的路径
         */
//        PageTitleImage.pageTitleImageDao.findById(imageId).set("imageSource", "/upfile/images/" + dateStr + outputFileName).update();
        PageTitleImage.pageTitleImageDao.findById(imageId).set("imageSource", titleImgUrl).update();

        /*删除原文件*/
        File image = new File(inputDir + inputFileName);
        if (image.exists()) {
            image.delete();
        }

        /*删除压缩后的存于本地的图片*/
        File image2 = new File(outputDir + outputFileName);
        if (image2.exists()){
            image2.delete();
        }

        /*向裁剪页面发送图片信息*/
        setAttr("imageId", imageId);
        setAttr("pageId", pageId);
        setAttr("recomPos",recomPos);
        //TODO:这里移植到云服务器端后也需要变
//        setAttr("imageSource", Properties.ImgSrc_CloudServer + dateStr + outputFileName);

        //OSS后的路径
        setAttr("imageSource", titleImgUrl);

        //TODO:这里是Windows本地的地址
        //setAttr("imageSource", Properties.ImgSrc_Windows + dateStr + outputFileName);
        /*图片物理地址发送到客户端*/
        //setAttr("localPicPath", saveDir + outputFileName);
        //setAttr("imageId", dateUnixStr); // 发送图片imageId到客户端
        //renderJson();
        if(type==1)
            renderJsp("/selectBreak.jsp");
        else if(type==2)
            renderJsp("/selectTopic.jsp");
        else
            renderJsp("/selectImage.jsp");

    }

	/**
     * 更换break图和专题大图
     */
    public void uploadNewImage(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
        Date today = new Date();

        //TODO:云服务器&本地Linxu服务器图片储存位置
        String saveDir = Properties.ImgNewSaveDir_Linux;
        //TODO:本地Windows服务器图片存储位置
        //String saveDir = Properties.ImgSaveDir_Windows + sdf.format(today);

        /*获取上传图片文件，存储到本地*/
//        UploadFile newImage = getFile("newPic", saveDir);
        UploadFile uf = getFile("newPic",saveDir);
        String nameType = getPara("type");
        /*获取明天的日期*/
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        Date dt = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(dt);
        calendar.add(calendar.DATE, 1);//把日期往后增加 1 天.整数往后推,负数往前移动
        dt=calendar.getTime(); //这个时间就是日期往后推 1 天的结果
        String dateString = simpleDateFormat.format(dt);

        uf.getFile().renameTo(new File(saveDir + nameType + "-" + dateString +".jpg"));

        LOGGER.info("上传新图片信息： " + "我也不知道，反正上传的是break2和4或者专题大图哦");

        redirect("/page/recomCollect.jsp");

    }


    /**
     * 重新截取新的图片
     */
    //TODO:浩然新功能
    public void cutNewImage() {
        int x = getParaToInt("x");
        int y = getParaToInt("y");
        int w = getParaToInt("w");
        int h = getParaToInt("h");
        int recomPos = getParaToInt("recomPos");
        int pageId = getParaToInt("pageId");

        //String localPicPath = getPara("localPicPath");
        String imageId = getPara("imageId");
        String src = getPara("src");

//        Date today = new Date();
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");



        /**
         * 剪裁后的图片存储文件为 desImageFile(File)
         */
        //TODO:云服务器&本地Linxu服务器
//        String saveDir = Properties.ImgSaveDir_Linux + sdf.format(new Date());

        //TODO:本地Windows服务器
        //String saveDir = Properties.ImgSaveDir_Windows + sdf.format(today);

//        String newImageName = String.valueOf(today.getTime()); // 裁剪后的图片名
//        File desImageFile = null;

        // 创建新的裁剪后的图像文件，如果没有则新建
//        try {
//            desImageFile = new File(saveDir + newImageName + ".jpg");
//            if (!desImageFile.getParentFile().exists()) {
//                desImageFile.getParentFile().mkdirs();
//            }
//            desImageFile.createNewFile();
//        } catch (Exception exception) {
//            LOGGER.error("裁剪新的图片出错,新建的图片已存在...");
//        }

        /**
         * 对原图进行裁剪，裁剪后的图片存储到 desImageFile
         */
//        PageTitleImage pageTitleImage = PageTitleImage.pageTitleImageDao.findById(imageId);
//        String localPicPath = "/kuibu/static/res" + pageTitleImage.get("imageSource");
        //TODO: 需要更改的地方，这里是为了在Widnows环境中调试
        //String localPicPath = "E:\\mysoftware\\tomcat\\webapps\\editorJfinalProject\\upfile\\images\\2015\\09\\14\\1442234190709.jpg";
        //String localPicPath = "D:\\apache-tomcat-7.0.61\\webapps\\editorJfinalProject" + pageTitleImage.get("imageSource");
//        String imageName = ImageCut.abscut(localPicPath, desImageFile, x, y, w, h);
//        String sqlDir = "/upfile/images/" + sdf.format(today) + imageName;

        /**
         * 把裁剪后的图片的地址存储到数据库
         */
//        try {
//            PageTitleImage.pageTitleImageDao.findById(imageId).set("imageSrc2", sqlDir).update();
//        } catch (Exception exception) {
//            LOGGER.error("标题图片2上传到数据库失败...", exception);
//        }

        String newsrc = src + "@" + x + "-" + y + "-" + w + "-" + h + "a";
        try {
//            PageTitleImage.pageTitleImageDao.findById(imageId).set("imageSrc", sqlDir).update();
            PageTitleImage.pageTitleImageDao.findById(imageId).set("imageSrc2",newsrc).update();
        } catch (Exception exception) {
            LOGGER.error("标题图片上传到数据库失败...", exception);
        }

        /**
         *数据库设置推荐位置 recomPos
         */

        // 默认文章属于推荐分类
        int pageType = 2;
        // 如果选择位置为一级分类滑图
        if(recomPos==0){
            pageType=1;
        }

        // 设置pageType和recomPos
        PageEdit.pageEditDao.findById(pageId).set("pageType",pageType).set("recomPos", recomPos).update();

        /**
         * 设置isTodayRecom为1
         */
//        PageEdit.pageEditDao.findById(pageId).set("isTodayRecom",1).update();
        if(recomPos !=1){
            PageEdit.pageEditDao.findById(pageId).set("isTodayRecom", 1).update();
        }
        redirect(Properties.Server_IP + "/editorJfinalProject/page/gotoRecomPage/1-1");
    }

    /**
     * 选择专题位置
     */
    public void selectTopic(){
        String pageId = getPara("pageId");
        String imageId = getPara("imageId");
        int recomPos = getParaToInt("selectTopic");

        PageTitleImage pageTitleImage = PageTitleImage.pageTitleImageDao.findById(imageId);
        //String localPicPath = PageTitleImage.pageTitleImageDao.getLocalPathById(image_id);

        /**
         * 要发送给页面的信息有：
         * 1. 原图url：imageSource --->显示
         * 2. 标题图片的ID：imageId --->下一步，裁剪图片要知道图片的ID才能进行裁剪
         */
//        setAttr("imageSource", Properties.Server_IP + pageTitleImage.get("imageSource"));
        setAttr("imageSource", pageTitleImage.get("imageSource"));
        //TODO: 需要更改的地方,这里是为了在Widnows环境中调试
        //setAttr("imageSource", "http://localhost:8080/editorJfinalProject" + pageTitleImage.get("imageSource"));

        //setAttr("localPicPath",localPicPath);
        setAttr("pageId", pageId);
        setAttr("imageId", imageId);
        setAttr("recomPos",recomPos);
        renderJsp("/selectTopic.jsp");
    }

    /**
     * 选择Break位置
     */
    public void selectBreak(){
        String pageId = getPara("pageId");
        String imageId = getPara("imageId");
        int recomPos = getParaToInt("selectBreak");

        PageTitleImage pageTitleImage = PageTitleImage.pageTitleImageDao.findById(imageId);
        //String localPicPath = PageTitleImage.pageTitleImageDao.getLocalPathById(image_id);

        /**
         * 要发送给页面的信息有：
         * 1. 原图url：imageSource --->显示
         * 2. 标题图片的ID：imageId --->下一步，裁剪图片要知道图片的ID才能进行裁剪
         */
//        setAttr("imageSource", Properties.Server_IP + pageTitleImage.get("imageSource"));
        setAttr("imageSource", pageTitleImage.get("imageSource"));
        //TODO: 需要更改的地方,这里是为了在Widnows环境中调试
        //setAttr("imageSource", "http://localhost:8080/editorJfinalProject" + pageTitleImage.get("imageSource"));

        //setAttr("localPicPath",localPicPath);
        setAttr("pageId", pageId);
        setAttr("imageId", imageId);
        setAttr("recomPos",recomPos);
        renderJsp("/selectBreak.jsp");
    }
}
